package com.agua.enturno.servicios.impl;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.roles.Cliente;
import com.agua.enturno.modelo.turno.EstadoDeTurno;
import com.agua.enturno.modelo.turno.Horario;
import com.agua.enturno.persistencia.dao.ClienteDAO;
import com.agua.enturno.persistencia.dao.HorarioDAO;
import com.agua.enturno.servicios.HorarioService;
import com.agua.enturno.vista.dto.HorarioDTO;
import com.agua.enturno.vista.dto.HorarioFullDTO;
import com.agua.enturno.vista.dto.TurnoDTO;
import com.agua.enturno.vista.dto.assemblers.HorarioAssembler;
import com.agua.enturno.vista.dto.assemblers.HorarioFullAssembler;
import com.agua.enturno.vista.dto.assemblers.TurnoAssembler;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public class HorarioServiceImpl implements HorarioService {

	private HorarioDAO horarioDAO;
	private ClienteDAO clienteDAO;
	
	private HorarioAssembler horarioAssembler;
	private HorarioFullAssembler horarioFullAssembler;
	private TurnoAssembler turnoAssembler;
	
	
	/*------------------------------------ Public methods ----------------------------------*/

	@Override
	@Transactional
	public HorarioDTO findById(Long id) {
		return horarioAssembler.assemble(horarioDAO.findById(id));
	}

	@Override
	@Transactional
	public HorarioFullDTO findFullById(Long id) {
		return horarioFullAssembler.assemble(horarioDAO.findById(id));
	}
	
	@Override
	@Transactional
	public TurnoDTO sacarTurno(Long horarioId, Long clienteId) throws ExcepcionDeReglaDelNegocio {
		Horario horario = horarioDAO.findById(horarioId);
		Cliente cliente = clienteDAO.findById(clienteId);
		
		return turnoAssembler.assemble(horario.sacarTurno(cliente));
	}
	
	@Override
	@Transactional
	public List<TurnoDTO> findTurnos(Long horarioId) {
		return turnoAssembler.assemble(horarioDAO.findById(horarioId).getTurnos());
	}
	
	@Override
	@Transactional
	public void deshabilitarHorario(Long horarioId, String motivo) {
		Horario horario = horarioDAO.findById(horarioId);
		horario.deshabilitarTurnos(motivo);
	}
	
	@Override
	@Transactional
	public EstadoDeTurno habilitarHorario(Long horarioId) {
		Horario horario = horarioDAO.findById(horarioId);
		horario.habilitarTurnos();
		
		return horario.getEstado();
	}

	/*--------------------------------------------------------------------------------------*/
	/*---------------------------------- Geters and seters ---------------------------------*/

	public void setHorarioDAO(HorarioDAO horarioDAO) {
		this.horarioDAO = horarioDAO;
	}
	
	public void setClienteDAO(ClienteDAO clienteDAO) {
		this.clienteDAO = clienteDAO;
	}
	
	public void setHorarioAssembler(HorarioAssembler horarioAssembler) {
		this.horarioAssembler = horarioAssembler;
	}
	
	public void setHorarioFullAssembler(HorarioFullAssembler horarioFullAssembler) {
		this.horarioFullAssembler = horarioFullAssembler;
	}
	
	public void setTurnoAssembler(TurnoAssembler turnoAssembler) {
		this.turnoAssembler = turnoAssembler;
	}

	/*--------------------------------------------------------------------------------------*/

}
